public class MyLinkedList<E> {
    private static class Node<E> {
        E data;       // 节点存储的数据
        Node<E> next; // 指向下一个节点的指针

        Node(E data) {
            this.data = data;
            this.next = null;
        } // 构造函数，初始化节点数据和指针
    }

    private Node<E> head; // 链表头节点
    private Node<E> tail; // 链表尾节点
    private int size;     // 链表长度

    public MyLinkedList() {
        head = null; // 初始化头节点为空
        tail = null; // 初始化尾节点为空
        size = 0;    // 初始化链表长度为0
    }

    public void add(E data) {
        Node<E> newNode = new Node<>(data); // 创建新节点
        if (head == null) { // 如果链表为空
            head = newNode; // 新节点成为头节点
            tail = newNode; // 新节点也是尾节点
        } else {
            tail.next = newNode; // 将新节点添加到链表末尾
            tail = newNode;      // 更新尾节点为新节点
        }
        size++; // 更新链表长度
    }

    public E get(int index) {
        if (index < 0 || index >= size) { // 检查索引是否有效
            throw new IndexOutOfBoundsException("Index out of bounds"); // 抛出异常
        }
        Node<E> current = head; // 从头节点开始遍历
        for (int i = 0; i < index; i++) { // 遍历到指定索引
            current = current.next; // 移动到下一个节点
        }
        return current.data; // 返回指定索引的节点数据
    }

    
    public static void main(String[] args) {
        MyLinkedList<Integer> list = new MyLinkedList<>(); // 创建链表实例
        list.add(1); // 添加元素1
        list.add(2); // 添加元素2
        list.add(3); // 添加元素3
        System.out.println(list.get(1)); // 获取索引1的元素，输出2
    }
}